/*****************************************************************************************************
 * 本程序任务执行分为两种类型，一种是时间片，另一种是循环，整个系统只有一个中断，就是定时器，中断间隔为10ms
 * 时间片执行发送数据以及变化速度，时间片最小单位为10ms，任务有10ms的，有50ms的，有500ms的，有1000ms的
 * 循环用于接收CAN数据
 * 
 * 时间片：
 * 10ms的执行速度变化以及发送第一帧
 * 50ms的发送第2、3、4帧
 * 500ms的闪烁led，用于提示系统工作
 * 1000ms的用于判断CAN接收是否超时无数据，2次以上认为无整车数据，速度逐渐降为0
 ******************************************************************************************************/
#include "Tc_TaskControl.h"
#include "Tc_AllTasks.h"


#define OPEN 0x55
#define LOCKED 0xAA

//time machine value
uint8_t Task_Level_10msUB=LOCKED;
//uint8_t Task_Level_20msUB=LOCKED;
uint8_t Task_Level_50msUB=LOCKED;
uint8_t Task_Level_100msUB=LOCKED;
uint8_t Task_Level_500msUB=LOCKED;
uint8_t Task_Level_1000msUB=LOCKED;

//计时统计数值
uint16_t Pc_CounterUW=0;

void TaskCtrl_TaskControl_m(void);
void TaskCtrl_task_10ms_m(void);
void TaskCtrl_task_50ms_m(void);
void TaskCtrl_task_100ms_m(void);
void TaskCtrl_task_500ms_m(void);
void TaskCtrl_task_1000ms_m(void);

//initial and start pit
void TaskCtrl_StartTaskControl_g(void)
{
    Tasks_SystemInitial_g();
}

//while里一直执行,接收can数据
void TaskCtrl_WhileTask_g(void)
{
    Tasks_ReceiveCan_g(); //receive can
	//执行任务
 	TaskCtrl_TaskControl_m();
    
    
}

//stop pit
void TaskCtrl_StopTaskControl_g(void)
{
	Tasks_SystemFinished_g();
}

//tasks list
void TaskCtrl_TaskControl_m(void)
{

	 //----------10ms任务--------
	 if(Task_Level_10msUB == OPEN)
	 {
		  TaskCtrl_task_10ms_m();
		  Task_Level_10msUB = LOCKED;
	 }
      
     //----------50ms任务--------
	 if(Task_Level_50msUB == OPEN)
	 {
		  TaskCtrl_task_50ms_m();
		  Task_Level_50msUB = LOCKED;
	 }
     
    //----------100ms任务--------
	 if(Task_Level_100msUB == OPEN)
	 {
		  TaskCtrl_task_100ms_m();
		  Task_Level_100msUB = LOCKED;
	 }

     //----------500ms任务--------
	 if(Task_Level_500msUB == OPEN)
	 {
         TaskCtrl_task_500ms_m();
		  Task_Level_500msUB = LOCKED;
	 }
      
     //----------1000ms任务--------
	 if(Task_Level_1000msUB == OPEN)
	 {
		  TaskCtrl_task_1000ms_m();
		  Task_Level_1000msUB = LOCKED;
	 }
      
}


//10ms执行一次,发送can数据
void TaskCtrl_task_10ms_m(void)
{
    Tasks_SpeedChange_g();
    Tasks_CanSendFrame1_g(); //CAN发送帧1
    Tasks_WatchDogClear_g();
    
}

//50ms执行一次，发送can数据
void TaskCtrl_task_50ms_m(void)
{
    Tasks_CanSendFrame234_g();
}

void TaskCtrl_task_100ms_m(void)
{
    Tasks_A4964_State_g();
}

//500ms执行一次，发送can数据
void TaskCtrl_task_500ms_m(void)
{
    //Sp_GetChipTemperature();
	Tasks_GpioToggle_g();
    Tasks_AdcConvert_g();
}

//1000ms执行一次，用于确认接收can数据间隔是否超过2s
void TaskCtrl_task_1000ms_m(void)
{
    Tasks_CanReceiveTimeoutCount_g();
}




//定时器1，中断弱定义覆盖函数
//10ms timer out
void Timer1CallBack()
{
	Pc_CounterUW++;

    //超过100次后变1
	Pc_CounterUW=(Pc_CounterUW>100)?1:Pc_CounterUW;

    Task_Level_10msUB=OPEN; //10ms每次任务都执行到
    
    if(Pc_CounterUW%5==0) //5次执行一次50ms任务
        Task_Level_50msUB=OPEN;

    if(Pc_CounterUW%10==0) //10次执行一次100ms任务
        Task_Level_100msUB=OPEN;
    
    if(Pc_CounterUW%50==0) //50次执行一次500ms任务
        Task_Level_500msUB=OPEN;
    
    if(Pc_CounterUW%100==0) //100次执行一次1000ms任务
        Task_Level_1000msUB=OPEN;

    
}



